export function generateRandomId() {
    // 生成的随机数是一个小数，转换为 36 进制后，会得到一个包含小数点（.）的字符串。
    // substring(2, 9) 的作用是去掉开头的 0.，并提取后面的 7 个字符。
    // 使用 36 进制的原因是为了让生成的字符串尽可能短，同时包含足够的字符（数字和字母）来保证随机性。
    // 如果使用 10 进制（toString(10)），生成的字符串只包含数字。
    // 如果使用 16 进制（toString(16)），生成的字符串包含数字和 a-f。
    // 使用 36 进制，生成的字符串包含数字和 a-z，随机性更高。
    return "id-" + Date.now() + "-" + Math.random().toString(36).substring(2,9);
}

export function deepCopy(target, map = new WeakMap()) {
    if(target === null) return target;
    if(target instanceof RegExp) return new RegExp(target);
    if(target instanceof Date) return new Date(target);
    if(typeof target !== 'object') return target;
    if(map.get(target)) return map.get(target);
    const cloneTarget = new target.constructor();
    map.set(target, cloneTarget);
    Reflect.ownKeys(target).forEach(key => {
        cloneTarget[key] = deepCopy(target[key], map);
    });
    return cloneTarget;
}